#include "ElementoParseado.h"
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

/* ******************************************************************
 *                        PRUEBAS UNITARIAS							*
 * *****************************************************************/
 
/* Función auxiliar para imprimir si estuvo OK o no. */
void print_test (char* name, bool result) {
    printf("%s: %s\n", name, result? "OK" : "ERROR");
}



void prueba_crear_ElementoParseado_longitud_Cero() {
	
	char cadena[]="hola";
	ElementoParseado_t* elemento = ElementoParseado_crear(cadena,0);
	print_test("Prueba crear elemento parseado con longitud 0", !elemento);
}
void prueba_crear_ElementoParseado_Con_CadenaNULL() {
	char* cadena=NULL;
	ElementoParseado_t* elemento = ElementoParseado_crear(cadena,4);
	print_test("Prueba crear elemento parseado con cadena nula", !elemento);
}

void prueba_crear_ElementoParseado_Valido() {
	char cadena[]="hola";	
	ElementoParseado_t* elemento = ElementoParseado_crear(cadena,strlen(cadena));
	print_test("Prueba crear elemento parseado valido", elemento !=NULL);
	ElementoParseado_destruir(elemento);
}

void prueba_ElementoParseado_Ver_Cadena() {
	char cadena[]="hola";	
	ElementoParseado_t* elemento = ElementoParseado_crear(cadena,strlen(cadena));
	print_test("Pruebo que la cadena parseada es hola", strcmp(cadena,ElementoParseado_verCadenaParseada(elemento))==0);
	ElementoParseado_destruir(elemento);
}

void prueba_ElementoParseado_Ver_longitud() {
	char cadena[]="hola";	
	ElementoParseado_t* elemento = ElementoParseado_crear(cadena,strlen(cadena));
	print_test("Pruebo que la cadena parseada tiene la longitud correspondiente", ElementoParseado_verLongitud(elemento)==4);
	ElementoParseado_destruir(elemento);
}


void prueba_ElementoParseado_AgregarUnaUbicacion(){
	char cadena[]="hola";	
	ElementoParseado_t* elemento = ElementoParseado_crear(cadena,strlen(cadena));	
	print_test("Pruebo al elemento parseado agregarle una ubicacion", ElementoParseado_agregarUbicacion(elemento,0,1));
	ElementoParseado_destruir(elemento);
	
}
void prueba_ElementoParseado_AgregarUbicaciones(){
	char cadena[]="hola";	
	ElementoParseado_t* elemento = ElementoParseado_crear(cadena,strlen(cadena));	
	ElementoParseado_agregarUbicacion(elemento,0,1);
	print_test("Pruebo al elemento parseado agregarle otra ubicacion pero en el mismo archivo", ElementoParseado_agregarUbicacion(elemento,15,1));
	ElementoParseado_destruir(elemento);	
	
}

void prueba_ElementoParseado_VerUbicaionesDeUnaPalabra(){
	char cadena[]="hola";
	ElementoParseado_t* elemento = ElementoParseado_crear(cadena,strlen(cadena));	
	ElementoParseado_agregarUbicacion(elemento,0,1);
	ElementoParseado_agregarUbicacion(elemento,15,1);
	ElementoParseado_agregarUbicacion(elemento,0,2);
	ElementoParseado_agregarUbicacion(elemento,15,2);
	ElementoParseado_agregarUbicacion(elemento,22,3);
	lista_t* lista_Ubicaciones=ElementoParseado_verUbicaciones(elemento);
	Ubicador_t* ubicador;
	lista_iter_t* iter=lista_iter_crear(lista_Ubicaciones);
	ubicador=lista_iter_ver_actual(iter);
	print_test("Prueba veo que el numero del archivo del primer ubicador es el 1",Ubicador_verArchivo(ubicador)==1);
	lista_iter_avanzar(iter);
	ubicador=lista_iter_ver_actual(iter);
	print_test("Prueba veo que el numero del archivo del Segundo ubicador es el 2",Ubicador_verArchivo(ubicador)==2);
	lista_iter_avanzar(iter);
	ubicador=lista_iter_ver_actual(iter);
	print_test("Prueba veo que el numero del archivo del Tercero ubicador es el 3",Ubicador_verArchivo(ubicador)==3);	
	lista_iter_avanzar(iter);
	print_test("Prueba veo que no hay mas ubicadores en el Elemento Parseado",lista_iter_al_final(iter));
	lista_iter_destruir(iter);
	ElementoParseado_destruir(elemento);	
	
}

void prueba_ElementoParseado_PosicionesEnElArchivos(){
	char cadena[]="hola";
	ElementoParseado_t* elemento = ElementoParseado_crear(cadena,strlen(cadena));	
	ElementoParseado_agregarUbicacion(elemento,0,1);
	ElementoParseado_agregarUbicacion(elemento,15,1);
	ElementoParseado_agregarUbicacion(elemento,18,1);	
	lista_t* lista_Ubicaciones=ElementoParseado_verUbicaciones(elemento);
	Ubicador_t* ubicador=lista_ver_primero(lista_Ubicaciones);
	lista_iter_t* iter_Ubicador=lista_iter_crear(Ubicador_verPosiciones(ubicador));
	
	int* posicion;
	posicion=lista_iter_ver_actual(iter_Ubicador);
	print_test("Prueba que en las ubicaciones del ubicador el 0 es el primero",*posicion==0);
	lista_iter_avanzar(iter_Ubicador);
	posicion=lista_iter_ver_actual(iter_Ubicador);
	print_test("Prueba que en las ubicaciones del ubicador el 15 es el segundo",*posicion==15);
	lista_iter_avanzar(iter_Ubicador);
	posicion=lista_iter_ver_actual(iter_Ubicador);
	/* Recordar que se guardan listas de distancias */
	print_test("Prueba que en las ubicaciones del ubicador el 18 es el tercero",*posicion==3);
	lista_iter_avanzar(iter_Ubicador);
	print_test("Prueba veo que no hay mas ubicadores en el Elemento Parseado",lista_iter_al_final(iter_Ubicador));
	
	
	lista_iter_destruir(iter_Ubicador);
	ElementoParseado_destruir(elemento);	
	
}


/* ******************************************************************
 *                        PROGRAMA PRINCIPAL						*
 * *****************************************************************/

int main (int argc, char** argv) {
	printf ("\nCOMIENZO DE PRUEBAS ELEMENTO PARSEADO.\n\n");
	
	prueba_crear_ElementoParseado_longitud_Cero();
	prueba_crear_ElementoParseado_Con_CadenaNULL();
	prueba_crear_ElementoParseado_Valido();
	prueba_ElementoParseado_Ver_Cadena();
	prueba_ElementoParseado_Ver_longitud();
	prueba_ElementoParseado_AgregarUnaUbicacion();
	prueba_ElementoParseado_AgregarUbicaciones();
	prueba_ElementoParseado_VerUbicaionesDeUnaPalabra();
	prueba_ElementoParseado_PosicionesEnElArchivos();
	
	printf ("\nFIN DE PRUEBAS ELEMENTO PARSEADO.\n\n");
	return 0;
}
